#ifndef CELLULE_HPP
#define CELLULE_HPP

#include "Algebre/Coord.hpp"
#include "Algebre/Vecteur.hpp"

class Camera;
class Environnement;

/** Classe qui implémente un ensemble de pixels.
 *
 * Cette classe est responsable du rendu des pixel pour une plage
 * donnée du "film" de la caméra. Le but est d'avoir une classe que
 * l'on peut ensuite faire hériter de QObject pour faire exécuter dans
 * un QThread.
 *
 * La set interfacée avec l'extérieur par la méthode genereCellule,
 * qui appelle la méthode correspondant au mode de rendu souhaité
 * (primaire ou secondaire, càd avec antialiasing).
 *
 * @author Johan "Solo" Luisier
 * @date Janvier 2013
 */
class Cellule
{
public:
  Cellule( Camera * cam, const unsigned& minX = -1u, const unsigned& maxX = -1u,
	   const unsigned& minY = -1u, const unsigned& maxY = -1u );
  virtual ~Cellule();
  void genereCellule();
  const bool& renduPrimaire() const;
  void setRenduPrimaire( const bool& prim );
  const unsigned& minX() const;
  unsigned& rMinX();
  void setMinX( const unsigned& min );
  const unsigned& maxX() const;
  unsigned& rMaxX();
  void setMaxX( const unsigned& max );
  const unsigned& minY() const;
  unsigned& rMinY();
  void setMinY( const unsigned& min );
  const unsigned& maxY() const;
  unsigned& rMaxY();
  void setMaxY( const unsigned& max );
protected:
  /** Pointeur sur l'instance de Camera pour laquelle on va effectuer
   * le rendu.
   */
  Camera* PtrCamera;
  /** Pointeur sur l'environnement à rendre.
   */
  Environnement* Scene;
  unsigned MinX, /**< Coordonée @f$ x @f$ minimale pour le rendu. */
    MaxX, /**< Coordonée @f$ x @f$ maximale pour le rendu. */
    MinY, /**< Coordonée @f$ y @f$ minimale pour le rendu. */
    MaxY; /**< Coordonée @f$ x @f$ maximale pour le rendu. */
  /** Contient @e true si l'instance doit faire le rendu primaire, qui
   * consiste à lancer un rayon par pixel. Pour le rendu secondaire
   * (uniquement avec l'antialiasing activé) cette value est @e false.
   */
  bool RenduPrimaire;
  /** Focale effective de l'instance de Camera, obtenue en multipliant
   * la focale par le facteur d'over-sampling.
   */
  double FocaleEff;
  /** Copie du vecteur de la direction de l'instance de Camera.
   */
  VecteurU DirCopie;
  /** Copie du vecteur définissant la hauteur de l'image.
   */
  VecteurU HautCopie;
  /** Copie du vecteur définissant la largeur de l'image.
   */
  VecteurU LargCopie;
  /** Copie de la position de l'instance de Camera.
   */
  Coord PosCopie;
private:
  void effectueRenduPrimaire();
  void effectueRenduSecondaire();
};

#endif // CELLULE_HPP
